Skip to content

The gate goes first, and it looks like the game - #224

Merged
0xward merged 2 commits into
mainfrom
claude/nullstate-onchain-text-q6g2a3
Aug 2, 2026
Merged

The gate goes first, and it looks like the game#224
0xward merged 2 commits into
mainfrom
claude/nullstate-onchain-text-q6g2a3

Conversation

@0xward

@0xward 0xward commented Aug 2, 2026

Copy link
Copy Markdown
Owner

Two bugs the owner found by opening the real thing in a private window. Both were mine.

Placement

The gate was rendered below phase === 'menu', and 'menu' is what draws the world map. These are sequential early returns, so order in the file is the behaviour: the map won, and the login could not appear until something moved the phase off it — so it turned up after the map instead of before it.

The block now sits ahead of every phase, which is what its own comment claimed all along.

Styling

It used ns-signin-card and ns-signin-sub. This app defines neither, so the screen rendered as unstyled text on a black rectangle.

Nothing caught it and nothing could have: tsc does not know about CSS, and check:cssvars only validates custom properties. It now uses the markup and stylesheet SignInScreen already had — the bracket frame, the plate fill, the white Google button, the bevelled clips — and the suite gained a check that every ns- class the gate names is really declared in signin.css, which would have failed loudly on the version that shipped.

The three methods are on the screen

One button that opened a modal to ask which method you wanted hid the offer behind a press — a player who wants Google could not see that Google was on offer. Each method is its own button now, and each opens Privy already narrowed to that one method, so the choice is made on a screen that looks like this game and Privy only handles the mechanics of whichever was chosen.

The wallet button still avoids the phrase check:copy bans, and says the true thing: it is for people who already have one, not an instruction to go get one.

The three marks moved to components/game/SignInMarks.tsx rather than being copied into a second file. Two Google marks is two chances for one to be quietly recoloured until the screens diverge, and Google's brand guidelines make that a compliance problem rather than a matter of taste.

Testing

✓ 22/22 test:privy        ✓ tsc clean       ✓ build 142/242 kB (unchanged)
✓ check:copy             ✓ check:cssvars   ✓ check:market   ✓ audit
✓ lint 35 (one below baseline)

The screen was rendered in a real browser at 390×844 against a build carrying the production app id, and the screenshot was sent to the owner for approval before merge. Privy's own modal still is not covered — it needs an allowed origin this sandbox cannot be.


Generated by Claude Code

Two things the owner found by opening the real thing in a private window, both
of them mine.

PLACEMENT. The gate was rendered BELOW `phase === 'menu'`, and 'menu' is what
draws the world map. Sequential early returns mean order in the file *is* the
behaviour: the map won, and the login could not appear until something moved the
phase off it — so it turned up AFTER the map instead of before it. Owner:
*"harusnya sebelum user membuka maps, jd di awal banget persis setelah user klik
Play game di landing page."* The block now sits ahead of every phase, which is
what its own comment claimed all along.

STYLING. It used `ns-signin-card` and `ns-signin-sub`, which this app does not
define anywhere, so it rendered as unstyled text on a black rectangle. Owner:
*"halaman login nya jelek banget."* Nothing caught it and nothing could have:
tsc does not know about CSS, and check:cssvars only validates custom properties.
It now uses the markup and stylesheet SignInScreen already had — the bracket
frame, the plate fill, the white Google button, the bevelled clips — and the
test suite gained a check that every ns- class the gate names is really declared
in signin.css.

THE THREE METHODS ARE ON THE SCREEN. One button that opened a modal to ask which
method you wanted hid the offer behind a press: a player who wants Google could
not see that Google was on offer. Each method is its own button now, and each
opens Privy already narrowed to that one method, so the choice is made on a
screen that looks like this game and Privy only handles the mechanics.

The three marks moved to components/game/SignInMarks.tsx rather than being
copied. Two Google marks is two chances for one to be quietly recoloured until
the screens diverge — and Google's guidelines make that a compliance problem
rather than a matter of taste.

Verified: tsc clean, build unchanged at 142/242 kB, 22/22 test:privy,
check:copy, check:cssvars, check:market and audit pass, lint 35 (one below the
baseline). The screen was rendered in a real browser at 390x844 and the
screenshot sent for approval before merge.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017A764RdnwpyWnG7uCNhMiQ
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@vercel

vercel Bot commented Aug 2, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
nullstate Ready Ready Preview Aug 2, 2026 4:28pm

OWNER: *"itu kalo aku klik google, ga muncul 2x pop up kan? layar privy juga
maksudku."* It did, and checking rather than answering from memory is what
found it: `login({loginMethods:['google']})` opens Privy's modal holding a
single Google button — the same question this screen just asked, asked again —
and only then hands off to Google's account chooser.

useLoginWithOAuth().initOAuth() goes straight to Google with no Privy UI at all,
so the tap on "Continue with Google" is now the last thing before Google's own
screen. It is a full-page redirect rather than a popup, which is the right shape
on a phone anyway: popups are what mobile browsers block.

Privy marks that hook @experimental, so it is not the only path. A throw falls
back to the modal — one extra screen is a worse login, an unrecoverable one is
no login at all.

Email and wallet stay on Privy's modal on purpose. There the modal is doing real
work rather than repeating a question: typing an address, or choosing which of
several wallets. Nothing about the screen itself changed, so the approved
screenshot still stands.

Verified: tsc clean, build unchanged at 142/242 kB, 24/24 test:privy, check:copy
clean.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017A764RdnwpyWnG7uCNhMiQ
@0xward
0xward merged commit 0220420 into main Aug 2, 2026
4 of 5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant